package com.ccnf.service;


import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.IService;
import com.ccnf.model.entity.Invitation;
import com.ccnf.model.entity.SocialUser;
import com.ccnf.model.pojo.InvitationDetail;
import com.ccnf.model.pojo.InvitationReferenceVo;

import java.util.List;

/**
 * 邀请函相关服务方法
 */
public interface InvitationService extends IService<Invitation> {

    /**
     * 录入邀请函数据
     * @param invitation 录入邀请函数据
     */
    Long save(Invitation invitation);

    /**
     * 通过邀请函ID更新邀请函信息
     * @param invitation 需要更新的邀请函数据，必须携带邀请函ID
     */
    void modify(Invitation invitation);

    /**
     * 查询邀请函基本信息，不返回邀请函内容字段，效率考虑
     * @param invitationId 邀请函ID
     * @return 返回邀请函信息
     */
    Invitation findBasicById(Long invitationId);

    /**
     * 查询我的邀请函列表，状态status为0或者1
     * @param expoId 展会ID
     * @param userId 当前用户ID
     * @param page 分页参数
     */
    Page<Invitation> findPersonalWithPage(Long expoId, Long userId, Page page);

    /**
     * 通过用户ID分页查询用户收藏的邀请函列表信息
     * @param userId 用户ID
     * @param page 分页参数
     */
    Page<InvitationDetail> findCollectionWithPage(Long expoId, Long userId, Page page);

    /**
     * 通过用户ID分页查询用户回收站的邀请函列表信息
     * @param userId 用户ID
     * @param page 分页参数
     */
    Page<Invitation> findTrashWithPage(Long expoId, Long userId, Page page);


    /**
     * 通过邀请函ID获取创建邀请函的用户信息
     * @param invitationId 邀请函ID
     * @return 返回创建邀请函的用户信息
     */
    SocialUser findUserInfoByInvitationId(Long invitationId);

    /**
     * 获取邀请函详情信息，带邀请函内容字段，用于创建人重新编辑邀请函和用户浏览邀请函获取邀请函内容
     * @param invitationId 邀请函ID
     * @param userId 当前用户ID
     * @return 邀请函信息
     */
    Invitation findDetailByUserIdAndInvitationId(Long invitationId, Long userId);

    /**
     * 用于处理邀请函的浏览统计
     * @param invitationId 邀请函ID
     * @param userId 用户ID
     */
    void handleInvitationUserBrowseRecord(Long invitationId, Long userId);

    /**
     * 获取首页邀请函模板案例列表
     * @param page 分页参数
     * @param invitationTitle 模糊搜索邀请函标题的字段
     * @return 返回分页查询的邀请函信息
     */
    Page<InvitationDetail> findTemplateWithPage(Page page, Long expoId, String invitationTitle);

    /**
     * 获取当前用户最新发布创建的邀请函信息
     * @param userId 当前用户ID
     * @return 返回最新发布的邀请函信息
     */
    InvitationDetail findLatestByUserId(Long expoId, Long userId);

    /**
     * 查询我发布的邀请函列表
     * @param userId 用户ID
     * @return 我发布的邀请函列表
     */
    Page<InvitationReferenceVo> findPublishByUserId(Long expoId, Long userId, Page page);

    /**
     * 查询所有可引用的邀请函列表
     * @param expoId 展会ID
     * @param userId 用户ID
     */
    Page<InvitationReferenceVo> findMoneyByUserId(Long expoId, Long userId, Page page);

    /**
     * 查询用户已经引用过的邀请函列表
     * @param expoId 展会ID
     * @param userId 用户ID
     */
    Page<InvitationReferenceVo> findReferenceByUserId(Long expoId, Long userId, Page page);

    /**
     * 查询用户被授权过的邀请函列表
     * @param expoId 展会ID
     * @param userId 用户ID
     */
    Page<InvitationReferenceVo> findAuthByUserId(Long expoId, Long userId, Page page);

    /**
     * 查询用户是否引用过该邀请函数据
     * @param invitationId 引用的邀请函ID
     * @param userId 用户ID
     */
    int findIsReferenceByInvitationIdAndUserId(Long invitationId, Long userId);
}